#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string.h>
#include<string>
#include<fstream>		//文件操作所需头文件
using namespace std;

/*
文件操作：
文件操作需要包含头文件<fstream>
文件类型分为文本文件(以ASCII码形式储存)和二进制文件(以二进制储存，用户一般读不懂)


文件操作三大类
1.ofstream: 写操作
2.ifstream: 读操作
3.fstream:  读写操作


文件打开方式
*ios::in		只读
*ios::out		只写
 ios::ate		初始位置：文件末尾
 ios::app		追加
*ios::trunc		如果文件存在，先删除再创建
*ios::binary	二进制方式
两种打开方式配合使用： ios::binary | ios::out

*/


#include <fstream>


//文本文件 写文件
/*
void test01()
{
	//1.包含头文件
	
	//2.创建流对象
	ofstream ofs;

	//3.打开文件
	ofs.open("D:\text.txt",  ios::app);

	//4.写数据
	ofs << "hello world" << endl;
	ofs << "你好" << endl;
	//5.关闭文件
	ofs.close();
}

//读取文件
void test02()

{
	//1.包含头文件
	// 
	//2.创建流对象
	ifstream ifs;

	//3.打开文件夹并判断文件是否打开成功
	ifs.open("test01.txt", ios::in);

	if (!ifs.is_open())
	{
		cout << "文件打开失败。" << endl;
		return;
	}

	//4.读取数据
	//第一种
	//char buf[1024] = { 0 };
	//while (ifs >> buf)	//当数据全部读完过后，会返回0
	//{
	//	cout << buf << endl;
	//}
	//文件中空格或着换行符读取出来都会换行

	//第二种
	//char buf[1024] = { 0 };
	//while (ifs.getline(buf, sizeof(buf)))
	//{
	//	cout << buf << endl;
	//}
	//此方法会将文件中数据一行一行读，即文件中换行，读出来才换行

	//第三种
	//string buf;
	//while (getline(ifs, buf))
	//{
	//	cout << buf << endl;
	//}
	//换行方式与第二行相同


	//第四种
	char c;
	while ((c = ifs.get()) != EOF)	//get函数每次读一个字符, EOF表示文件尾end of file
	{
		cout << c;
	}
	//此方法不建议

	//5.关闭文件
	ifs.close();
	
}

int main()
{
	//test01();
	test02();
	return 0;
}
*/

//二进制文件
//打开方式为ios::binary

class Person
{
public:
	char m_Name[64];	//写文件时最好不用string
	int m_Age;
};

//写文件，自定义类型也能写
void test01()
{
	//1.包含头文件
	//2.创建流对象
	ofstream ofs;

	//3.打开文件
	ofs.open("person.text", ios::out | ios::binary);

	//4.写文件	用write()函数  ostream& write((const char*) 类名, 数据长度)
	Person p = { "张三", 18 };
	ofs.write((const char*)&p, sizeof(Person));

	//5.关闭文件
	ofs.close();
}


//读取文件 用read()函数 istream& read(char* 类名, 数据长度)
void test02()
{
	//包含头文件
	//创建流对象并打开文件
	ifstream ifs("person.text", ios::in | ios::binary);

	//判断文件是否打开成功
	if (!ifs.is_open())
	{
		cout << "文件打开失败。" << endl;
		return;
	}

	//读取文件
	Person p;
	ifs.read((char *)&p, sizeof(Person));
	cout << "姓名: " << p.m_Name << endl << "年龄: " << p.m_Age << endl;

	//关闭文件
	ifs.close();
}

int main()
{
	//test01();
	test02();
	return 0;
}





